<?php
namespace Pinenut\Di;

use Pinenut\Di;

/**
 * Примесь внедрения зависимостей
 * Сохраняет контейнер для класса (статический)
 * Осуществляет инъекцию зависимости класса и объекта
 * 
 * 
 * ВАЖНО! не забываем включать вызов di() в конструктор, 
 * иначе внедрения зависимостей объектов не произойдёт
 * 
 * 
 * @author Kosh
 *
 */
trait Injectable {
	/**
	 * @var \Pinenut\Di
	 */
	private static $__diContainer = null;
	/**
	 * @param \Pinenut\Di $container
	 */
	static function setDiContainer(\Pinenut\Di $container) {
		self::$__diContainer = $container;
	}

	function di() {
		if (self::$__diContainer instanceof Di)
			self::$__diContainer->di ( $this );
	}

	static function injectStatic($property, $dependency) {
		if (property_exists ( get_called_class (), $property )) {
			static::${$property} = $dependency;
		}
	}
	function inject($property, $dependency) {
		if (property_exists ( $this, $property )) {
			$this->$property = $dependency;
		}
	}
}